package org.jeecg.wx.utils;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.HttpClientUtils;
import org.jeecg.common.util.JsonUtil;
import org.jeecg.common.util.oConvertUtils;
import org.jeecg.wx.constant.WXConstant;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * 微信小程序辅助工具类 https://developers.weixin.qq.com/miniprogram/dev/api-backend/
 * @Author zhengkai.blog.csdn.net
 * */
@Slf4j
public class WxUtil {

    /**
     * 获取微信token
     * @return
     */
    public static String getAccessTokenAsUrl(){
        //发送请求获取微信小程序TOKEN
        String result = HttpClientUtils.doGet(WXConstant.accent_token_url.replace("APPID", WXConstant.appId).replace("APPSECRET", WXConstant.appSecret));
        Map<String, Object> resultMap = (Map<String, Object>) JsonUtil.jsonToMap(result);
        return resultMap.get("access_token").toString();
    }

    /**
     * 下载带参数的小程序二维码
     * https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
     * by zhengkai.blog.csdn.net
     * @param accessToken 微信token
     * @param pathStr 保存图片的的path（全路径，包含图片名字）
     * @param certNumber 带过去小程序的参数，一般为你的业务参数，建议是id或者number
     * @param page 二维码跳转页面
     * */
    public static boolean downloadMiniCode(String accessToken, String pathStr, String certNumber, String page){
        //获取文件名
        String paths[] = pathStr.split("/");
        String fileName = paths[paths.length - 1];
        //判断文件夹是否存在，不存在则新建
        File folder = new File(pathStr.split(fileName)[0]);
        if (!folder.exists() && !folder.isDirectory()) {
            folder.mkdirs();
        }
        Map<String,Object> paramMap = new HashMap<>();
        //二维码携带参数 不超过32位 参数类型必须是字符串
        paramMap.put("scene", certNumber);
        //二维码跳转页面，根路径前不要填加 /，不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面。
        paramMap.put("page", page);
        //二维码的宽度
        paramMap.put("width", 450);
        //自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调
        paramMap.put("auto_color", true);
        //是否需要透明底色， is_hyaline 为true时，生成透明底色的小程序码
        paramMap.put("is_hyaline", false);
        try {
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            httpURLConnection.setConnectTimeout(10000);//连接超时 单位毫秒
            httpURLConnection.setReadTimeout(10000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            printWriter.write(JSONObject.toJSONString(paramMap));
            // flush输出流的缓冲
            printWriter.flush();
            //开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            OutputStream os = new FileOutputStream(new File(pathStr));
            int len;
            //设置缓冲写入
            byte[] arr = new byte[2048];
            while ((len = bis.read(arr)) != -1)
            {
                os.write(arr, 0, len);
                os.flush();
            }
            os.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
        return true;
    }

}
